package cn.fzkj.ws.component;

import cn.fzkj.ws.SocketHandler;
import cn.fzkj.ws.message.WsMessage;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;

/**
 * @author mr
 * @description websocket 消息发送服务
 * @since 2024/2/22
 */
@Slf4j
@RequiredArgsConstructor
public class WebSocketComponent {

    /**
     * 处理器
     */
    private final SocketHandler handler;

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param to 自
     * @param data 数据
     */
    public <T> void sendMsg(String to, T data) {
        sendMsg(to, null, null, data);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param to 自
     * @param type 类型
     * @param data 数据
     */
    public <T> void sendMsg(String to, Integer type, T data) {
        sendMsg(to, null, null, data);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param to 自
     * @param from 从
     * @param data 数据
     */
    public <T> void sendMsg(String to, String from, T data) {
        sendMsg(to, from, null, data);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param to 自
     * @param from 从
     * @param type 类型
     * @param data 数据
     */
    public <T> void sendMsg(String to, String from, Integer type, T data) {
        WsMessage<T> msg = new WsMessage<>();
        msg.setTo(to);
        msg.setFrom(from);
        msg.setType(type);
        msg.setContent(data);
        msg.setTimeStamp(System.currentTimeMillis());
        handler.sendMessage(msg);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param tos TOS
     * @param data 数据
     */
    public <T> void sendMsg(List<String> tos, T data) {
        sendMsg(tos, null, data);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param tos TOS
     * @param from 从
     * @param data 数据
     */
    public <T> void sendMsg(List<String> tos, String from, T data) {
        sendMsg(tos, from, null, data);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param tos TOS
     * @param from 从
     * @param type 类型
     * @param data 数据
     */
    public <T> void sendMsg(List<String> tos, String from, Integer type, T data) {
        if (CollectionUtils.isEmpty(tos)) {
            return;
        }
        WsMessage<T> msg = new WsMessage<>();
        msg.setFrom(from);
        msg.setType(type);
        msg.setContent(data);
        msg.setTimeStamp(System.currentTimeMillis());
        handler.sendMessageBroadCast(tos, msg);
    }

    /**
     * 发送消息
     *
     * @param <T> 泛型
     * @param message 消息
     */
    public <T> void sendMsg(WsMessage<T> message) {
        handler.sendMessage(message);
    }
}
